Skip to content

Docker Compose 架設 SQL Server 權限問題解決方案

TLDR

  • SQL Server 容器以非 root 使用者 (UID 10001) 執行,若掛載的 Volume 目錄權限不符,會導致 Access is denied 錯誤。
  • 解決方案:在啟動容器前,必須先手動建立 Volume 目錄,並將其擁有者變更為 UID 10001。
  • 核心指令:chown -R 10001:0 volumes
  • 注意事項:SQL Server 2025 映像檔中,sqlcmd 的路徑已變更為 /opt/mssql-tools18/bin/sqlcmd

問題情境:SQL Server 容器啟動失敗

當使用 Docker Compose 掛載本機目錄至 SQL Server 容器時,若該目錄的權限未正確設定,容器會因為無法存取預設的資料夾路徑而啟動失敗,並出現以下錯誤:

bash
ERROR: BootstrapSystemDataDirectories() failure (HRESULT 0x80070005)
00:01:10.10 Server ERROR: Setup FAILED copying system data file 'C:\templatedata\master.mdf' to '/var/opt/mssql/data/master.mdf': 5(Access is denied.)

什麼情況下會遇到這個問題:在 Linux 或 WSL 環境下,將本機目錄掛載至 SQL Server 容器的 /var/opt/mssql/data 等預設路徑,且該目錄的擁有者並非容器內的 mssql 使用者 (UID 10001) 時會發生。


正規解決方案

為了確保資料持久化且避免權限衝突,建議採取以下步驟進行設定:

1. 建立資料夾結構

docker-compose.yml 所在的目錄下,手動建立必要的子資料夾,確保目錄結構完整:

bash
mkdir -p volumes/data volumes/log volumes/backup

2. 設定資料夾權限

將目錄的擁有者變更為 SQL Server 容器內的 mssql 使用者 (UID 10001):

bash
chown -R 10001:0 volumes

TIP

實測發現,大多數情況下僅需執行 chown -R 10001:0 volumes 即可解決權限問題。

3. 啟動容器

完成權限設定後,即可正常啟動容器:

bash
docker-compose up -d

為什麼需要這樣設定?

SQL Server 映像檔內預定義了 mssql 使用者(UID 10001)。當 Docker 掛載本機目錄時,若該目錄由 root 或當前使用者擁有,容器內的 mssql 使用者將沒有寫入權限,導致系統資料檔無法複製到掛載的 Volume 中。

指令解析

  • chown -R 10001:0 volumes:將 volumes 目錄及其子目錄的擁有者改為 UID 10001,群組設為 0 (root)。
  • 避免依賴「失敗後自動建立目錄」:若未先建立目錄直接設定權限,Docker 可能無法正確套用權限,導致容器啟動時因權限不足而再次失敗。

注意事項:SQL Server 版本差異

WARNING

在 SQL Server 2025 映像檔中,sqlcmd 的路徑已從 /opt/mssql-tools/bin/sqlcmd 變更為 /opt/mssql-tools18/bin/sqlcmd。若您的 healthcheck 設定包含此路徑,請務必進行對應調整。


異動歷程

    • 初版文件建立。
    • 補充完整操作步驟,說明需先建立子資料夾再設定權限。
    • 新增權限設定簡化方案的 tip 說明,指出大多數情況下只需執行第三個指令。
    • 補充 SQL Server 2025 的 mssql-tools 路徑變更資訊。